import axios from 'axios';
import env from '../../build/env';
import semver from 'semver';
import packjson from '../../package.json';
import CONSTANTS from '../config/constants';
import jsPDF from 'jspdf'

let util = {};
util.title = function (title) {
    title = title || '电子奖状';
    window.document.title = title;
};

const ajaxUrl = CONSTANTS.SERVER_HOST;

util.ajax = axios.create({
    baseURL: ajaxUrl,
    timeout: 30000
});

util.toFormData = function (data) {
    let formData = new FormData();
    for (let key in data) {
        formData.append(key, data[key]);
    }
    return formData;
}

util.inOf = function (arr, targetArr) {
    let res = true;
    arr.forEach(item => {
        if (targetArr.indexOf(item) < 0) {
            res = false;
        }
    });
    return res;
};

util.oneOf = function (ele, targetArr) {
    if (targetArr.indexOf(ele) >= 0) {
        return true;
    } else {
        return false;
    }
};

util.showThisRoute = function (itAccess, currentAccess) {
    if (typeof itAccess === 'object' && Array.isArray(itAccess)) {
        return util.oneOf(currentAccess, itAccess);
    } else {
        return itAccess === currentAccess;
    }
};

util.getRouterObjByName = function (routers, name) {
    if (!name || !routers || !routers.length) {
        return null;
    }
    // debugger;
    let routerObj = null;
    for (let item of routers) {
        if (item.name === name) {
            return item;
        }
        routerObj = util.getRouterObjByName(item.children, name);
        if (routerObj) {
            return routerObj;
        }
    }
    return null;
};

util.handleTitle = function (vm, item) {
    if (typeof item.title === 'object') {
        return vm.$t(item.title.i18n);
    } else {
        return item.title;
    }
};

util.setCurrentPath = function (vm, name) {
    let title = '';
    let isOtherRouter = false;
    vm.$store.state.app.routers.forEach(item => {
        if (item.children.length === 1) {
            if (item.children[0].name === name) {
                title = util.handleTitle(vm, item);
                if (item.name === 'otherRouter') {
                    isOtherRouter = true;
                }
            }
        } else {
            item.children.forEach(child => {
                if (child.name === name) {
                    title = util.handleTitle(vm, child);
                    if (item.name === 'otherRouter') {
                        isOtherRouter = true;
                    }
                }
            });
        }
    });
    let currentPathArr = [];
    if (name === 'home_index') {
        currentPathArr = [
            {
                title: util.handleTitle(vm, util.getRouterObjByName(vm.$store.state.app.routers, 'home_index')),
                path: '',
                name: 'home_index'
            }
        ];
    } else if ((name.indexOf('_index') >= 0 || isOtherRouter) && name !== 'home_index') {
        currentPathArr = [
            {
                title: util.handleTitle(vm, util.getRouterObjByName(vm.$store.state.app.routers, 'home_index')),
                path: '/home',
                name: 'home_index'
            },
            {
                title: title,
                path: '',
                name: name
            }
        ];
    } else {
        let currentPathObj = vm.$store.state.app.routers.filter(item => {
            if (item.children.length <= 1) {
                return item.children[0].name === name;
            } else {
                let i = 0;
                let childArr = item.children;
                let len = childArr.length;
                while (i < len) {
                    if (childArr[i].name === name) {
                        return true;
                    }
                    i++;
                }
                return false;
            }
        })[0];

        if (currentPathObj) {
            if (currentPathObj.children.length <= 1 && currentPathObj.name === 'home') {
                currentPathArr = [
                    {
                        title: '首页',
                        path: '',
                        name: 'home_index'
                    }
                ];
            } else if (currentPathObj.children.length <= 1 && currentPathObj.name !== 'home') {
                currentPathArr = [
                    {
                        title: '首页',
                        path: '/home',
                        name: 'home_index'
                    },
                    {
                        title: currentPathObj.title,
                        path: '',
                        name: name
                    }
                ];
            } else {
                let childObj = currentPathObj.children.filter((child) => {
                    return child.name === name;
                })[0];
                currentPathArr = [
                    {
                        title: '首页',
                        path: '/home',
                        name: 'home_index'
                    },
                    {
                        title: currentPathObj.title,
                        path: '',
                        name: currentPathObj.name
                    },
                    {
                        title: childObj.title,
                        path: currentPathObj.path + '/' + childObj.path,
                        name: name
                    }
                ];
            }
        }
    }
    vm.$store.commit('setCurrentPath', currentPathArr);

    return currentPathArr;
};

util.openNewPage = function (vm, name, argu, query) {
    let pageOpenedList = vm.$store.state.app.pageOpenedList;
    let openedPageLen = pageOpenedList.length;
    let i = 0;
    let tagHasOpened = false;
    while (i < openedPageLen) {
        if (name === pageOpenedList[i].name) { // 页面已经打开
            vm.$store.commit('pageOpenedList', {
                index: i,
                argu: argu,
                query: query
            });
            tagHasOpened = true;
            break;
        }
        i++;
    }
    if (!tagHasOpened) {
        let tag = vm.$store.state.app.tagsList.filter((item) => {
            if (item.children) {
                return name === item.children[0].name;
            } else {
                return name === item.name;
            }
        });
        tag = tag[0];
        if (tag) {
            tag = tag.children ? tag.children[0] : tag;
            if (argu) {
                tag.argu = argu;
            }
            if (query) {
                tag.query = query;
            }
            vm.$store.commit('increateTag', tag);
        }
    }
    vm.$store.commit('setCurrentPageName', name);
};

util.toDefaultPage = function (routers, name, route, next) {
    let len = routers.length;
    let i = 0;
    let notHandle = true;
    while (i < len) {
        if (routers[i].name === name && routers[i].children && routers[i].redirect === undefined) {
            route.replace({
                name: routers[i].children[0].name
            });
            notHandle = false;
            next();
            break;
        }
        i++;
    }
    if (notHandle) {
        next();
    }
};

util.fullscreenEvent = function (vm) {
    vm.$store.commit('initCachepage');
    // 权限菜单过滤相关
    vm.$store.commit('updateMenulist');
    // 全屏相关
};

util.checkUpdate = function (vm) {
    axios.get('https://api.github.com/repos/iview/iview-admin/releases/latest').then(res => {
        let version = res.data.tag_name;
        vm.$Notice.config({
            duration: 0
        });
        if (semver.lt(packjson.version, version)) {
            vm.$Notice.info({
                title: 'iview-admin更新啦',
                desc: '<p>iView-admin更新到了' + version + '了，去看看有哪些变化吧</p><a style="font-size:13px;" href="https://github.com/iview/iview-admin/releases" target="_blank">前往github查看</a>'
            });
        }
    });
};

util.toPDF = function (url, name) {
    let Img = new Image();
    let dataURL = '';
    Img.setAttribute('crossOrigin', 'anonymous');
    Img.src = url;
    Img.onload = function () { // 要先确保图片完整获取到，这是个异步事件
        let canvas = document.createElement('canvas'); // 创建canvas元素
        canvas.width = Img.width;
        canvas.height = Img.height;
        canvas.getContext('2d').drawImage(Img, 0, 0, Img.width, Img.height); // 将图片绘制到canvas中
        dataURL = canvas.toDataURL('image/jpeg'); // 转换图片为dataURL
        let width = '';
        let height = '';
        let aspect = '';
        let widthMargin = 0;
        let heightMargin = 0;
        let widthScale = Img.width / 595.28;
        let heightScale = Img.height / 841.89;
        if (widthScale > heightScale) {
            aspect = 'landscape';
            width = 841.89;
            height = 841.89 / Img.width * Img.height;
            heightMargin = (595.28 - height) / 2;
        } else {
            height = 841.89;
            width = 841.89 / Img.height * Img.width;
            widthMargin = (595.28 - width) / 2;
        }
        var doc = new jsPDF(aspect, 'pt', 'a4');
        doc.addImage(dataURL, 'PNG', widthMargin, heightMargin, width, height);
        doc.save(name + '.pdf');
    };
}

function updateInnermostText($el, text) {
    const children = Array.from($el.children).filter(c => c.nodeName.toUpperCase() !== 'BR')
    if (children.length === 0) {
        $el.innerHTML = text
    } else {
        children.forEach(childEl => updateInnermostText(childEl, text))
    }
}

util.updateInnermostText = updateInnermostText

util.getDate = function (data, type) {
    let myDate;

    if (data instanceof Date) {
        myDate = data;
    } else if (typeof (data) == 'number') {
        myDate = new Date(data);
    } else {
        return data;
    }

    let Y = myDate.getFullYear(),
        M = myDate.getMonth() + 1,
        D = myDate.getDate(),
        H = myDate.getHours(),
        Min = myDate.getMinutes(),
        S = myDate.getSeconds();

    if (M < 10) {
        M = '0' + M;
    }
    if (D < 10) {
        D = '0' + D;
    }
    if (H < 10) {
        H = '0' + H;
    }
    if (Min < 10) {
        Min = '0' + Min;
    }
    if (S < 10) {
        S = '0' + S;
    }

    if (type == 'date') {
        return Y + '-' + M + '-' + D;
    } else {
        return Y + '-' + M + '-' + D + ' ' + H + ':' + Min + ':' + S;
    }
};
export default util;
